package core

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	_ "gorm.io/driver/mysql"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"os"
)

func CreateTable(dsn string, driver string, createSql string) error {
	db, err := sql.Open(driver, dsn)
	if err != nil {
		return err
	}
	defer func(db *sql.DB) {
		err := db.Close()
		if err != nil {

		}
	}(db)
	if err = db.Ping(); err != nil {
		return err
	}
	_, err = db.Exec(createSql)
	return err
}

// Sqlite 初始化sqlite数据库
func Sqlite() *gorm.DB {
	//admin := Cf.Sqlite
	//db, err := gorm.Open("sqlite3", admin.Dbname)
	//if err != nil {
	//	LG.Debug()("数据库初始化失败%v\n", err)
	//	os.Exit(0)
	//}
	//
	//_ = db.AutoMigrate(model.SysApi{}) //自动创建api需要提前创建表
	//return db
	return nil
}

func Postgres () *gorm.DB {
	dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=disable TimeZone=Asia/Shanghai",
		CF.Postgres.Host, CF.Postgres.UserName, CF.Postgres.Password, CF.Postgres.DBName, CF.Postgres.Port)
	db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
	if err!=nil{
		LG.Errorf("创建Postgres数据库句柄失败，%v", err)
		return nil
	}
	return db
}

func Mysql() *gorm.DB {
	admin := CF.Mysql

	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/", admin.UserName, admin.Password, admin.Host, admin.Port)
	createSql := fmt.Sprintf("CREATE DATABASE IF NOT EXISTS `%s` DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci;", admin.DBName)
	if err := CreateTable(dsn, "mysql", createSql); err != nil {
		LG.Debug("创建数据库失败, %v\n", err)
	}

	//db, err := gorm.Open("mysql", admin.Username+":"+admin.Password+"@("+admin.Host+")/"+admin.Dbname+"?"+admin.Option)
	option := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?%s", admin.UserName, admin.Password, admin.Host, admin.Port, admin.DBName, admin.Option)
	fmt.Println("数据库配置: ", option)
	mysqlConfig := mysql.Config{
		DSN:                       option, // DSN data source name
		DefaultStringSize:         191,    // string 类型字段的默认长度
		DisableDatetimePrecision:  true,   // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,   // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,   // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,  // 根据版本自动配置
	}
	db, err := gorm.Open(mysql.New(mysqlConfig),
		&gorm.Config{
			DisableForeignKeyConstraintWhenMigrating: true,
			NamingStrategy: schema.NamingStrategy{
				SingularTable: true, // 使用单数表名，启用该选项后，`User` 表将是`user`
			},
		})
	if err != nil {
		LG.Debug("数据库初始化失败, %v\n", err)
		os.Exit(0)
	} else {
		sqlDB, _ := db.DB()
		sqlDB.SetMaxIdleConns(admin.MaxIdleConns)
		sqlDB.SetMaxOpenConns(admin.MaxOpenConns)
		//db.LogMode(admin.LogMode)
	}

	return db
}
